﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Web.UI;
using APILocawebGatewayUI.Nucleo;

namespace APILocawebGatewayUI.REDECARD
{
    [ToolboxItem(true)]
    public sealed class RedeCard : Cartao
    {
        private Formulario form;


        public RedeCard()
        {

        }

        /// <summary>
        /// Este método é utilizado quando os controles são criados em execução.
        /// </summary>
        /// <param name="pagina">Página que está instanciando e criando o controle</param>
        /// <param name="bandeira">bandeira, pode ser obtido usando o enum localizado em APILocawebGatewayUI.REDECARD.Bandeira</param>
        /// <param name="numeroDoPedido">Número para controle interno</param>
        /// <param name="valor">valor formatado de acordo com o padrão Redecard. pode ser obtido usando:RedecardUtilidades.FormataMoedaParaForm()</param>
        public RedeCard(Page pagina, Bandeira bandeira, String numeroDoPedido, String valor)
            : base(pagina, valor, numeroDoPedido)
        {
            this.Bandeira = bandeira;

        }

        #region Propriedades
        public override string Modulo
        {
            get
            {
                return "REDECARD";
            }
        }

        public override string ImgCartao
        {
            get
            {
                return this.Bandeira == Bandeira.MASTERCARD ? "APILocawebGatewayUI.Recursos.ico_mastercard.gif" : "APILocawebGatewayUI.Recursos.ico_dinners.gif";
            }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Define o tipo de ambiente (teste ou producao).")]
        [DefaultValue("Teste")]
        [Browsable(false)]
        public override string Ambiente
        {
            get
            {
                object o = ViewState["RedecardAmbiente"];
                return o == null ? APILocawebConfiguration.Instancia.Redecard.Ambiente : o.ToString();
            }
            set { ViewState["RedecardAmbiente"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Define a bandeira do cartão para a transação.")]
        [DefaultValue(typeof(Bandeira), "MASTERCARD")]
        public Bandeira Bandeira
        {
            get
            {
                object o = ViewState["Bandeira"];
                if (o == null)
                    return Bandeira.MASTERCARD;
                return (Bandeira)o;
            }
            set { ViewState["Bandeira"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Origem da transação.")]
        [DefaultValue(typeof(OrigemTransacao), "AVista")]
        public OrigemTransacao OrigemTransacao
        {
            get
            {
                object o = ViewState["OrigemTransacao"];
                if (o == null)
                    return OrigemTransacao.AVista;
                return (OrigemTransacao)o;
            }
            set { ViewState["OrigemTransacao"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Código do tipo de transação fixo. O parâmetro “transação” deverá assumir o código “73” quando solicitar uma transação de Pré-Autorização.")]
        [DefaultValue("")]
        public string Transacao
        {
            get
            {
                object o = ViewState["Transacao"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["Transacao"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Campo utilizado para passagem de parâmetros")]
        [Browsable(false)]
        public override string CampoLivre
        {
            get
            {
                return base.CampoLivre = System.Web.HttpUtility.UrlEncode("V-" + this.Valor + "_O-0" + (int)OrigemTransacao + "_P-" + this.Parcelas);
            }

        }

        [Category("Parâmetros opcionais")]
        [Description("Idioma utilizado no ambiente Amex")]
        [DefaultValue(typeof(IdiomaDoSite), "Portugues")]
        public IdiomaDoSite IdiomaDoSite
        {
            get
            {
                object o = ViewState["IdiomaDoSite"];
                if (o == null)
                    return IdiomaDoSite.Portugues;
                return (IdiomaDoSite)o;
            }
            set { ViewState["IdiomaDoSite"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Define o uso do serviço AVS.")]
        [DefaultValue(typeof(AVS), "NAO")]
        public AVS AVS
        {
            get
            {
                object o = ViewState["AVS"];
                if (o == null)
                    return AVS.NAO;
                return (AVS)o;
            }
            set { ViewState["AVS"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Nome do frame para onde será retornado a URLBACK.")]
        [DefaultValue("")]
        public string FrameTargetUrl
        {
            get
            {
                object o = ViewState["FrameTargetUrl"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["FrameTargetUrl"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Endereço completo da URL da página ou imagem para exibição superior da interface da operadora.")]
        [DefaultValue("")]
        public string UrlCima
        {
            get
            {
                object o = ViewState["UrlCima"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["UrlCima"] = value; }
        }

        #endregion

        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            base.RenderBeginTag(writer);

            form = new Formulario();
            form.AddControl(new InputInvisivel("identificacao", this.Identificacao));
            form.AddControl(new InputInvisivel("ambiente", this.Ambiente));
            form.AddControl(new InputInvisivel("modulo", this.Modulo));
            form.AddControl(new InputInvisivel("operacao", this.Operacao));
            form.AddControl(new InputInvisivel("parcelas", this.Parcelas));
            form.AddControl(new InputInvisivel("bandeira", this.Bandeira.ToString()));
            form.AddControl(new InputInvisivel("valor", this.Valor));
            form.AddControl(new InputInvisivel("RedecardIdioma", this.IdiomaDoSite == IdiomaDoSite.Portugues ? "pt" : this.IdiomaDoSite == IdiomaDoSite.Espanhol ? "es" : "en"));
            form.AddControl(new InputInvisivel("juros", this.TipoDeParcelamento == TiposParcelamento.JurosDoLojista ? "0" : "1"));
            form.AddControl(new InputInvisivel("pedido", this.NumeroDoPedido));
            form.AddControl(new InputInvisivel("PAX1", this.CampoLivre));
            form.AddControl(new InputInvisivel("transacao", this.Transacao));
            form.AddControl(new InputInvisivel("TARGET", this.FrameTargetUrl));
            form.AddControl(new InputInvisivel("urlcima", this.UrlCima));
            form.AddControl(new InputInvisivel("AVS", this.AVS == AVS.NAO ? "" : "S"));
            writer.Write(form.Campos());
        }
    }
}